package biblioteca.modelos;

import biblioteca.entidades.Lector;
import biblioteca.entidades.TipoLector;
import biblioteca.excepciones.ExcepcionDeAplicacion;
import biblioteca.excepciones.ExcepcionDeBD;
import java.util.ArrayList;
import java.util.logging.Level;
import java.util.logging.Logger;
import poo.biblioteca.bd.BDLectores;

public class MdlLectores {

    private BDLectores bdLectores = new BDLectores();

    public void registrarTipoLector(TipoLector nuevoTipoLector) throws ExcepcionDeAplicacion {
        verificarTipoLector(nuevoTipoLector);
        try {
            bdLectores.registrarTipoLector(nuevoTipoLector);
        } catch (ExcepcionDeBD ex) {
            throw new ExcepcionDeAplicacion(ex.getMessage());
        }
    }

    private void verificarTipoLector(TipoLector nuevoTipoLector) throws ExcepcionDeAplicacion {
        if (nuevoTipoLector.getNombreTipoLector().isEmpty()) {
            throw new ExcepcionDeAplicacion("El nombre del Tipo de Lector no puede estar vacío");
        }
        if (nuevoTipoLector.getNumeroDiasPrestamo() < 1) {
            throw new ExcepcionDeAplicacion("El número de Días de Préstamo es inválido");
        }
        if (nuevoTipoLector.getNumeroMaxPrestamosSimultaneos() < 1) {
            throw new ExcepcionDeAplicacion("El número máximo de préstamos simultáneos es inválido");
        }
    }

    public void registrarLector(Lector nuevoLector) throws ExcepcionDeAplicacion {
        verificarLector(nuevoLector);
        try {
            bdLectores.registrarLector(nuevoLector);
        } catch (ExcepcionDeBD ex) {
            throw new ExcepcionDeAplicacion(ex.getMessage());
        }

    }

    public ArrayList<TipoLector> leerTipoDeLectores() throws ExcepcionDeBD {
        return bdLectores.leerTipoDeLectores();
    }

    private void verificarLector(Lector nuevoLector) throws ExcepcionDeAplicacion {
        //TODO: Mejorar drásticamente estas validaciones

        if (nuevoLector.getNombres().isEmpty() || nuevoLector.getApellidos().isEmpty()) {
            throw new ExcepcionDeAplicacion("El nombre y apellidos no pueden estar vacíos");
        }
        if (nuevoLector.getTipoLector().getNombreTipoLector().contains("Alumno") && nuevoLector.getCodigoAlumno().isEmpty()) {
            throw new ExcepcionDeAplicacion("Si el lector es alumno, se debe registrar su código");
        }
        if (nuevoLector.getDni().isEmpty()) {
            throw new ExcepcionDeAplicacion("El campo DNI no puede estar vacío");
        }

        //TODO: Validar el formato de email
        if (nuevoLector.getEmail().isEmpty()) {
            throw new ExcepcionDeAplicacion("El campo Email no puede estar vacío");
        }
        if (nuevoLector.getTelefono().isEmpty()) {
            throw new ExcepcionDeAplicacion("El campo Telefono no puede estar vacío");
        }
    }

    public ArrayList<Lector> buscarLectoresPorApellido(String apellidos) throws ExcepcionDeAplicacion {
        try {
            return bdLectores.buscarLectoresPorApellido(apellidos);
        } catch (ExcepcionDeBD ex) {
            throw new ExcepcionDeAplicacion(ex.getMessage());
        }
    }

    public ArrayList<Lector> buscarLectoresHabilitadosPorApellido(String apellidos) throws ExcepcionDeAplicacion {
        
        if (apellidos.length()<2)
            throw new ExcepcionDeAplicacion("Las búsquedas deben realizarse con al menos dos letras del apellido");
        
        ArrayList<Lector> lectoresHabilitados = new ArrayList<>();
        
        try {
            
            for (Lector lector : bdLectores.buscarLectoresHabilitadosPorApellido(apellidos)) {
                if (bdLectores.numeroPrestamosSinDevolverDeLector(lector) <= lector.getTipoLector().getNumeroMaxPrestamosSimultaneos())
                    lectoresHabilitados.add(lector);
            }

        } catch (ExcepcionDeBD ex) {
            throw new ExcepcionDeAplicacion(ex.getMessage());
        }
        return lectoresHabilitados;
    }
}
